package cn.collection.list;

import java.util.LinkedList;

public class Demo05 {
    /*
    3.数据结构
        3.1数据结构之栈和队列
            栈结构 先进后出
            队列结构 先进先出

        3.2数据结构之数组和链表
            数组结构 查询快、增删慢
            队列结构 查询慢、增删快

    4.List集合的实现类
        4.1 List集合子类的特点
            ArrayList集合
                底层是数组结构实现，查询快、增删慢
            LinkedList集合
                 底层是链表结构实现，查询慢、增删快

        4.2 LinkedList集合的特有功能
            特有方法
                        方法名	                说明
                public void addFirst(E e)	在该列表开头插入指定的元素
                public void addLast(E e)	将指定的元素追加到此列表的末尾
                public E getFirst()	        返回此列表中的第一个元素
                public E getLast()	        返回此列表中的最后一个元素
                public E removeFirst()	    从此列表中删除并返回第一个元素
                public E removeLast()	    从此列表中删除并返回最后一个元素

    5. 源码分析
        5.1 ArrayList源码分析：
            核心步骤：创建ArrayList对象的时候，他在底层先创建了一个长度为10的数组。
            数组名字：elementDate，定义变量size。

            size这个变量有两层含义：
            ①：元素的个数，也就是集合的长度
            ②：下一个元素的存入位置

            添加元素，添加完毕后，size++

            扩容时机一：
                当存满时候，会创建一个新的数组，新数组的长度，是原来的1.5倍，也就是长度为15.再把所有的元素，全拷贝到新数组中。
                如果继续添加数据，这个长度为15的数组也满了，那么下次还会继续扩容，还是1.5倍。
            扩容时机二：
                一次性添加多个数据，扩容1.5倍不够，怎么办呀？
                如果一次添加多个元素，1.5倍放不下，那么新创建数组的长度以实际为准。
            举个例子：
                在一开始，如果默认的长度为10的数组已经装满了，在装满的情况下，我一次性要添加100个数据很显然，10扩容1.5倍，变成15，还是不够，
                怎么办？此时新数组的长度，就以实际情况为准，就是110
        5.2 LinkedList源码分析：
            底层是双向链表结构
            核心步骤如下：
                刚开始创建的时候，底层创建了两个变量：一个记录头结点first，一个记录尾结点last，默认为null
                添加第一个元素时，底层创建一个结点对象，first和last都记录这个结点的地址值
                添加第二个元素时，底层创建一个结点对象，第一个结点会记录第二个结点的地址值，last会记录新结点的地址值
        5.3 迭代器源码分析：
            迭代器遍历相关的三个方法：
                Iterator iterator() ：获取一个迭代器对象
                boolean hasNext() ：判断当前指向的位置是否有元素
                E next() ：获取当前指向的元素并移动指针
    * */
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
//        public void addFirst(E e)	在该列表开头插入指定的元素
        method1(list);

//        public void addLast(E e)	将指定的元素追加到此列表的末尾
        method2(list);

//        public E getFirst()		返回此列表中的第一个元素
//        public E getLast()		返回此列表中的最后一个元素
        method3(list);

//        public E removeFirst()		从此列表中删除并返回第一个元素
//        public E removeLast()		从此列表中删除并返回最后一个元素
        method4(list);
    }

    private static void method4(LinkedList<String> list) {
        String first = list.removeFirst();
        System.out.println(first);

        String last = list.removeLast();
        System.out.println(last);

        System.out.println(list);
    }

    private static void method3(LinkedList<String> list) {
        String first = list.getFirst();
        String last = list.getLast();
        System.out.println(first);
        System.out.println(last);
    }

    private static void method2(LinkedList<String> list) {
        list.addLast("www");
        System.out.println(list);
    }

    private static void method1(LinkedList<String> list) {
        list.addFirst("qqq");
        System.out.println(list);
    }
}
